﻿using System;
using System.IO;
using Microsoft.Win32;

namespace OrbClientCacher
{
	public static class Utilities
	{
		/// <summary>
		/// Liest einen Wert aus der Registry und Versucht eine Typkonvertierung in den übergebenen Typ. Existiert ein
		/// Wert nicht, dann wird der Standardwert übernommen. Gegebenenfalls kann der Wert in der Registry mit dem
		/// Standardwert erstellt werden.
		/// </summary>
		/// <typeparam name="TReturn">Der Datentyp des Registry-Wertes</typeparam>
		/// <param name="key">Der Registry-Key unter dem der Wert gesucht werden soll</param>
		/// <param name="valueId">Der Schlüssel des Wertes der gesucht ist</param>
		/// <param name="def">Der Standard-Rückgabewert für diesen Schlüssel</param>
		/// <param name="setIfUnset">Wenn true, dann wird der Wert mit dem Standardwert erstellt</param>
		/// <returns>Den Inhalt des Wertes oder den Standardwert</returns>
		public static TReturn GetSetValue<TReturn>(RegistryKey key, string valueId, TReturn def, bool setIfUnset = false)
		{

			object value = key.GetValue(valueId);

			if (value == null)
			{
				if (setIfUnset) key.SetValue(valueId, def);
				value = def;
			}

			return (TReturn)Convert.ChangeType(value, typeof(TReturn));
		}

		public static void SetValue<TValue>(RegistryKey key, string valueId, TValue value, RegistryValueKind kind = RegistryValueKind.Unknown)
		{
			if (key == null) return;
			key.SetValue(valueId, value, kind);
		}

		public static TReturn GetSetJSON<TReturn>(string file, TReturn contents)
		{
			TReturn retVal;

			if (File.Exists(file))
			{
				retVal = JSONHelper.Deserialize<TReturn>(new FileStream(file, FileMode.Open));
			}
			else
			{
				JSONHelper.Serialize<TReturn>(contents, new FileStream(file, FileMode.Create));
				retVal = contents;
			}

			return retVal;
		}

		private static bool SubKeyExists(RegistryKey key, string subKey)
		{

			if (key.OpenSubKey(subKey) != null)
				return true;

			return false;
		}
	}
}
